package com.dimples.dd.system.model.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import com.dimples.dd.common.enums.UserTypeEnum;
import com.dimples.dd.tenant.core.dataobject.TenantBaseDO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;

import java.time.LocalDateTime;
import java.util.Map;

/**
 * 短信日志
 */
@Schema(description = "短信日志")
@Data
@EqualsAndHashCode(callSuper = true)
@TableName(value = "system_sms_log", autoResultMap = true)
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class SystemSmsLogDO extends TenantBaseDO {

    /**
     * 编号
     */
    @TableId(value = "id", type = IdType.AUTO)
    @Schema(description = "编号")
    private Long id;

    // ========= 渠道相关字段 ========= //

    /**
     * 短信渠道编号
     * <p>
     * 关联 {@link SystemSmsChannelDO#getId()}
     */
    @TableField(value = "channel_id")
    @Schema(description = "短信渠道编号")
    private Long channelId;

    /**
     * 短信渠道编码
     * <p>
     * 冗余 {@link SystemSmsChannelDO#getCode()}
     */
    @TableField(value = "channel_code")
    @Schema(description = "短信渠道编码")
    private String channelCode;

    // ========= 模板相关字段 ========= //

    /**
     * 模板编号
     * <p>
     * 关联 {@link SystemSmsTemplateDO#getId()}
     */
    @TableField(value = "template_id")
    @Schema(description = "模板编号")
    private Long templateId;

    /**
     * 模板编码
     * <p>
     * 冗余 {@link SystemSmsTemplateDO#getCode()}
     */
    @TableField(value = "template_code")
    @Schema(description = "模板编码")
    private String templateCode;

    /**
     * 短信类型
     * <p>
     * 冗余 {@link SystemSmsTemplateDO#getType()}
     */
    @TableField(value = "template_type")
    @Schema(description = "短信类型")
    private Byte templateType;

    /**
     * 基于 {@link SystemSmsTemplateDO#getContent()} 格式化后的内容
     */
    @TableField(value = "template_content")
    @Schema(description = "短信内容")
    private String templateContent;

    /**
     * 基于 {@link SystemSmsTemplateDO#getParams()} 输入后的参数
     */
    @TableField(value = "template_params", typeHandler = JacksonTypeHandler.class)
    @Schema(description = "短信参数")
    private Map<String, Object> templateParams;

    /**
     * 短信 API 的模板编号
     * <p>
     * 冗余 {@link SystemSmsTemplateDO#getApiTemplateId()}
     */
    @TableField(value = "api_template_id")
    @Schema(description = "短信 API 的模板编号")
    private String apiTemplateId;

    // ========= 手机相关字段 ========= //

    /**
     * 手机号
     */
    @TableField(value = "mobile")
    @Schema(description = "手机号")
    private String mobile;

    /**
     * 用户编号
     */
    @TableField(value = "user_id")
    @Schema(description = "用户编号")
    private Long userId;

    /**
     * 用户类型
     * <p>
     * 枚举 {@link UserTypeEnum}
     */
    @TableField(value = "user_type")
    @Schema(description = "用户类型")
    private Integer userType;

    // ========= 发送相关字段 ========= //

    /**
     * 发送状态
     * <p>
     * 枚举 {@link com.dimples.dd.system.enums.sms.SmsSendStatusEnum}
     */
    @TableField(value = "send_status")
    @Schema(description = "发送状态")
    private Integer sendStatus;

    /**
     * 发送时间
     */
    @TableField(value = "send_time")
    @Schema(description = "发送时间")
    private LocalDateTime sendTime;

    /**
     * 短信 API 发送结果的编码
     * <p>
     * 由于第三方的错误码可能是字符串，所以使用 String 类型
     */
    @TableField(value = "api_send_code")
    @Schema(description = "短信 API 发送结果的编码")
    private String apiSendCode;

    /**
     * 短信 API 发送失败的提示
     */
    @TableField(value = "api_send_msg")
    @Schema(description = "短信 API 发送失败的提示")
    private String apiSendMsg;

    /**
     * 短信 API 发送返回的唯一请求 ID
     * <p>
     * 用于和短信 API 进行定位于排错
     */
    @TableField(value = "api_request_id")
    @Schema(description = "短信 API 发送返回的唯一请求 ID")
    private String apiRequestId;

    /**
     * 短信 API 发送返回的序号
     * <p>
     * 用于和短信 API 平台的发送记录关联
     */
    @TableField(value = "api_serial_no")
    @Schema(description = "短信 API 发送返回的序号")
    private String apiSerialNo;

    // ========= 接收相关字段 ========= //

    /**
     * 接收状态
     * <p>
     * 枚举 {@link com.dimples.dd.system.enums.sms.SmsReceiveStatusEnum}
     */
    @TableField(value = "receive_status")
    @Schema(description = "接收状态")
    private Integer receiveStatus;

    /**
     * 接收时间
     */
    @TableField(value = "receive_time")
    @Schema(description = "接收时间")
    private LocalDateTime receiveTime;

    /**
     * API 接收结果的编码
     */
    @TableField(value = "api_receive_code")
    @Schema(description = "API 接收结果的编码")
    private String apiReceiveCode;

    /**
     * API 接收结果的说明
     */
    @TableField(value = "api_receive_msg")
    @Schema(description = "API 接收结果的说明")
    private String apiReceiveMsg;
}